﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionePolveriLib.Facades;
using ControlsLib;
using GestionePolveriLib.Utilities;
using GestionePolveriLib.BL.Reports;
using GestionePolveriLib.BL;
using GestionePolveri2.DAL;
using BrightIdeasSoftware;
using FrameworkLib.Configurations.FormsConfiguration;

namespace GestionePolveri2.QuickReportInfo
{
    public partial class QuickReportInfoDialog : Form, IForm
    {
        Color gruppoFiltri = Color.FromArgb(253, 233, 217);
        Color gruppoTotali = Color.FromArgb(255, 165, 79);
        Color rigaTotali = Color.FromArgb(255, 246, 143);

        private List<QuickReportInfoItem> m_data = null;

        public QuickReportInfoDialog()
        {
            InitializeComponent();
        }

        public void InitializeForm()
        {
            Initialize();

            this.objectListView1.FormatCell += new EventHandler<FormatCellEventArgs>(objectListView1_FormatCell);

            //base.Initialize(this.objectListView1);
        }

        private void Initialize()
        {
            ColoraHeaders();

            LoadImpianti();
            LoadFamiglie();
            //LoadApplicazione();
            LoadApplicazione2();

            LoadDati();

            if (m_data == null)
            {
                m_data = new List<QuickReportInfoItem>();
            }

            //LoadDati();

            this.dtpFrom.Enabled = this.chkPeriodo.Checked;
            this.dtpTo.Enabled = this.chkPeriodo.Checked;
            chkPeriodo.CheckedChanged += new EventHandler(chkPeriodo_CheckedChanged);

            FormConfigurationDecorator.Initialize(this, this.objectListView1);
        }

        void chkPeriodo_CheckedChanged(object sender, EventArgs e)
        {
            this.dtpFrom.Enabled = this.chkPeriodo.Checked;
            this.dtpTo.Enabled = this.chkPeriodo.Checked;
        }

        private void LoadDati()
        {
            QuickReportInfoFacade qrif = new QuickReportInfoFacade();
            //List<QuickReportInfoItem> data = qrif.Load();
            m_data = qrif.Load();

            if (m_data != null)
            {
                AddToListview(m_data);
            }
        }

        private void objectListView1_FormatCell(object sender, FormatCellEventArgs e)
        {
            QuickSintesiItem mov = (QuickSintesiItem)e.Model;
            Color m_color = Color.White;

            if (mov.Tag == "RigaTotali")
            {
                e.Item.BackColor = rigaTotali;
                e.SubItem.BackColor = rigaTotali;
            }
            else
            {
                if (e.Column.HeaderFormatStyle != null)
                {
                    if (e.ColumnIndex == 0)
                    {
                        e.Item.BackColor = e.Column.HeaderFormatStyle.Normal.BackColor;
                    }
                    else
                    {
                        if (e.ColumnIndex > 0)
                        {
                            e.SubItem.BackColor = e.Column.HeaderFormatStyle.Normal.BackColor;
                        }
                        else
                        {
                            e.SubItem.BackColor = e.Column.HeaderFormatStyle.Normal.BackColor;
                        }
                    }
                }
            }
        }

        private void ColoraHeaders()
        {
            HeaderFormatStyle m_gruppoFiltro = new HeaderFormatStyle();
            m_gruppoFiltro.SetBackColor(gruppoFiltri);
            //m_gruppoOrigineMovimento.SetForeColor(Color.Red);
            m_gruppoFiltro.SetFont(new Font(FontFamily.GenericSerif, 8, FontStyle.Bold));

            HeaderFormatStyle m_gruppoTotali = new HeaderFormatStyle();
            m_gruppoTotali.SetBackColor(gruppoTotali);
            //m_gruppoPolvereVerniciante.SetForeColor(Color.Red);
            m_gruppoTotali.SetFont(new Font(FontFamily.GenericSerif, 8, FontStyle.Bold));

            //
            this.olvColumnFamiglia.HeaderFormatStyle = m_gruppoFiltro;
            this.olvColumnFiltro.HeaderFormatStyle = m_gruppoFiltro;
            this.olvColumnApplicazione.HeaderFormatStyle = m_gruppoFiltro;

            this.olvColumnTotKg.HeaderFormatStyle = m_gruppoTotali;
            this.olvColumnTotN.HeaderFormatStyle = m_gruppoTotali;
            this.olvColumnTotVAL.HeaderFormatStyle = m_gruppoTotali;
        }

        private List<QuickSintesiItem> CalcolaTotali(List<QuickSintesiItem> items)
        {
            QuickSintesiItem rdTotali = new QuickSintesiItem();
            rdTotali.Tag = "RigaTotali";
            rdTotali.Descrizione = string.Empty;
            rdTotali.DateFrom = null;
            rdTotali.DateTo = null;

            foreach (QuickSintesiItem item in items)
            {
                rdTotali.Kg_Tot += item.Kg_Tot;
                rdTotali.N_Tot += item.N_Tot;
                rdTotali.Val_Tot += item.Val_Tot;

                rdTotali.Ral1.Kg += item.Ral1.Kg;
                rdTotali.Ral1.N += item.Ral1.N;
                rdTotali.Ral1.Val += item.Ral1.Val;

                rdTotali.Ral2.Kg += item.Ral2.Kg;
                rdTotali.Ral2.N += item.Ral2.N;
                rdTotali.Ral2.Val += item.Ral2.Val;

                rdTotali.Verticale.Kg += item.Verticale.Kg;
                rdTotali.Verticale.N += item.Verticale.N;
                rdTotali.Verticale.Val += item.Verticale.Val;

                rdTotali.Ferro.Kg += item.Ferro.Kg;
                rdTotali.Ferro.N += item.Ferro.N;
                rdTotali.Ferro.Val += item.Ferro.Val;

                rdTotali.ColorwoodGrande.Kg += item.ColorwoodGrande.Kg;
                rdTotali.ColorwoodGrande.N += item.ColorwoodGrande.N;
                rdTotali.ColorwoodGrande.Val += item.ColorwoodGrande.Val;

                rdTotali.ColorwoodPiccolo.Kg += item.ColorwoodPiccolo.Kg;
                rdTotali.ColorwoodPiccolo.N += item.ColorwoodPiccolo.N;
                rdTotali.ColorwoodPiccolo.Val += item.ColorwoodPiccolo.Val;

                rdTotali.AllineamentoInventario.Kg += item.AllineamentoInventario.Kg;
                rdTotali.AllineamentoInventario.N += item.AllineamentoInventario.N;
                rdTotali.AllineamentoInventario.Val += item.AllineamentoInventario.Val;

                rdTotali.Smaltito.Kg += item.Smaltito.Kg;
                rdTotali.Smaltito.N += item.Smaltito.N;
                rdTotali.Smaltito.Val += item.Smaltito.Val;

                rdTotali.Venduto.Kg += item.Venduto.Kg;
                rdTotali.Venduto.N += item.Venduto.N;
                rdTotali.Venduto.Val += item.Venduto.Val;

                rdTotali.Reso.Kg += item.Reso.Kg;
                rdTotali.Reso.N += item.Reso.N;
                rdTotali.Reso.Val += item.Reso.Val;

                rdTotali.Inventario.Kg += item.Inventario.Kg;
                rdTotali.Inventario.N += item.Inventario.N;
                rdTotali.Inventario.Val += item.Inventario.Val;
            }

            items.Insert(0, rdTotali);

            return items;
        }

        private void tsbAdd_Click(object sender, EventArgs e)
        {
            QuickReportInfoItem item = new QuickReportInfoItem();

            if (this.chkPeriodo.Checked)
            {
                if (this.dtpTo.Value < this.dtpFrom.Value)
                {
                    MessageBox.Show("Intervallo di date non corretto...", "Gestione Polveri");
                    return;
                }
                else
                {
                    item.DateFrom = new DateTime(this.dtpFrom.Value.Year, this.dtpFrom.Value.Month, this.dtpFrom.Value.Day, 0, 0, 0);
                    item.DateTo = new DateTime(this.dtpTo.Value.Year, this.dtpTo.Value.Month, this.dtpTo.Value.Day, 23, 59, 0);
                }
            }

            if (string.IsNullOrWhiteSpace(this.txtDescrizione.Text))
            {
                MessageBox.Show("Inserire la descrizione...", "Gestione Polveri");
                return;
            }
            else
            {
                item.Descrizione = this.txtDescrizione.Text;
            }

            if (((string)this.chkCmbApplicazione.Properties.GetCheckedItems() != null) && 
                (this.chkCmbApplicazione.Properties.GetCheckedItems().ToString() != string.Empty))
            {
                item.Applicazione = (string)this.chkCmbApplicazione.Properties.GetCheckedItems().ToString();

                item.Applicazione = item.Applicazione.Replace(" ", "");
            }

            if ((this.chkCmbFamiglia.Properties.GetCheckedItems() != null) &&
                (this.chkCmbFamiglia.Properties.GetCheckedItems().ToString() != string.Empty))
            {
                //item.Famiglie = this.chkCmbFamiglia.Properties.GetCheckedItems().ToString();

                string[] ids = this.chkCmbFamiglia.Properties.GetCheckedItems().ToString().Split(new char[] { ',' });

                FamigliaColoriFacade impf = new FamigliaColoriFacade();
                foreach (string s in ids)
                {
                    int id = int.Parse(s.Trim());

                    ((List<FamigliaColore>)item.Famiglie).Add(impf.Get(id));
                }
            }

            if ((this.chkCmbImpianti.Properties.GetCheckedItems() != null) &&
                (this.chkCmbImpianti.Properties.GetCheckedItems().ToString() != string.Empty))
            {
                string[] ids = this.chkCmbImpianti.Properties.GetCheckedItems().ToString().Split(new char[] { ',' });
                
                ImpiantoFacade impf = new ImpiantoFacade();
                foreach(string s in ids)
                {
                    int id = int.Parse(s.Trim());

                    ((List<Impianto>)item.Impianti).Add(impf.GetImpianto(id));
                }
            }

            if ((!string.IsNullOrWhiteSpace(item.Applicazione)) ||
                (item.Famiglie.Count() != 0) ||
                (item.Impianti.Count() != 0))
            {
                if (m_data == null)
                {
                    m_data = new List<QuickReportInfoItem>();
                }

                m_data.Add(item);

                AddToListview(m_data);

                ResetControls();
            }
            else
            {
                MessageBox.Show("Devi selezionare almeno un filtro tra Applicazione, Famiglia o Impianto !",
                                "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void AddToListview(List<QuickReportInfoItem> data)
        {
            this.listView1.Items.Clear();

            foreach (QuickReportInfoItem item in data)
            {
                ListViewItem lvi = new ListViewItem();
                lvi.Tag = item;
                lvi.Text = item.Descrizione;
                lvi.Checked = true;

                ListViewItem.ListViewSubItem subItem1 = new ListViewItem.ListViewSubItem(lvi, item.GetDescrizioneFamiglie());
                ListViewItem.ListViewSubItem subItem2 = new ListViewItem.ListViewSubItem(lvi, item.GetDescrizioneImpianti());
                ListViewItem.ListViewSubItem subItem3 = new ListViewItem.ListViewSubItem(lvi, item.Applicazione);
                ListViewItem.ListViewSubItem subItem4 = new ListViewItem.ListViewSubItem(lvi, item.DateFrom.GetValueOrDefault().ToShortDateString());
                ListViewItem.ListViewSubItem subItem5 = new ListViewItem.ListViewSubItem(lvi, item.DateTo.GetValueOrDefault().ToShortDateString());

                lvi.SubItems.Add(subItem1);
                lvi.SubItems.Add(subItem2);
                lvi.SubItems.Add(subItem3);
                lvi.SubItems.Add(subItem4);
                lvi.SubItems.Add(subItem5);

                this.listView1.Items.Add(lvi);
            }
        }

        private void ResetControls()
        {
            this.txtDescrizione.Text = string.Empty;

            //this.cmbApplicazione.SelectedIndex = 0;

            this.chkCmbApplicazione.SetEditValue(null);
            this.chkCmbApplicazione.DeselectAll();
            this.chkCmbApplicazione.SetEditValue("Selezionare una applicazione");
            this.chkCmbApplicazione.RefreshEditValue();

            this.chkCmbFamiglia.SetEditValue(null);
            this.chkCmbFamiglia.DeselectAll();
            this.chkCmbFamiglia.SetEditValue("Selezionare una famiglia");
            this.chkCmbFamiglia.RefreshEditValue();

            this.chkCmbImpianti.SetEditValue(null);
            this.chkCmbImpianti.DeselectAll();
            this.chkCmbImpianti.SetEditValue("Selezionare un impianto");
            this.chkCmbImpianti.RefreshEditValue();
        }

        private void tsbModify_Click(object sender, EventArgs e)
        {
            if (this.listView1.CheckedItems.Count != 1)
            {
                MessageBox.Show("Selezionare il solo elemento da modificare !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                ListViewItem item = this.listView1.CheckedItems[0];
                QuickReportInfoItem qrii = (QuickReportInfoItem)item.Tag;

                FilterEditor fe = new FilterEditor();
                fe.QuickReportInfoItem = qrii;
                if (fe.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    QuickReportInfoItem itemMod = fe.QuickReportInfoItem;

                    this.listView1.BeginUpdate();

                    ListViewItem lvi = this.listView1.CheckedItems[0];

                    lvi.Tag = itemMod;
                    lvi.Text = itemMod.Descrizione;
                    lvi.Checked = true;

                    lvi.SubItems[1].Text = itemMod.GetDescrizioneFamiglie();
                    lvi.SubItems[2].Text = itemMod.GetDescrizioneImpianti();
                    lvi.SubItems[3].Text = itemMod.Applicazione;
                    lvi.SubItems[4].Text = itemMod.DateFrom.GetValueOrDefault().ToShortDateString();
                    lvi.SubItems[5].Text = itemMod.DateTo.GetValueOrDefault().ToShortDateString();


                    tsbSave_Click(sender, e);

                    m_data.Clear();

                    this.listView1.EndUpdate();
                }
            }
        }

        private void tsbDelete_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Stai per eliminare i filtri selezionati. Vuoi procedere ?", "Gestione Polvere", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == System.Windows.Forms.DialogResult.Yes)
            {
                try
                {
                    for (int i = this.listView1.CheckedItems.Count - 1; i >= 0; i--)
                    {
                        this.listView1.Items.Remove(this.listView1.CheckedItems[i]);
                    }

                    tsbSave_Click(sender, e);

                    m_data.Clear();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(string.Format("Errore: {0}", ex.Message), "Gestione Polvere", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void tsbShow_Click(object sender, EventArgs e)
        {
            // aggiorna la tabella con i risultati....
            QuickReportInfoFacade f = new QuickReportInfoFacade();
            List<QuickSintesiItem> data = new List<QuickSintesiItem>();

            foreach (ListViewItem item in this.listView1.CheckedItems)
            {
                QuickReportInfoItem qrii = (QuickReportInfoItem)item.Tag;
                if (chkPeriodo.Checked)
                {
                    qrii.DateFrom = new DateTime(this.dtpFrom.Value.Year, this.dtpFrom.Value.Month, this.dtpFrom.Value.Day, 0, 0, 0);
                    qrii.DateTo = new DateTime(this.dtpTo.Value.Year, this.dtpTo.Value.Month, this.dtpTo.Value.Day, 23, 59, 0);
                }
                else
                {
                    qrii.DateFrom = null;
                    qrii.DateTo = null;
                }

                QuickSintesiItem qsItem = f.GetSintesi2(qrii);
                if (qsItem != null)
                {
                    qsItem.Filtro = qrii.GetDescrizioneImpianti();
                    //qsItem.DescrizioneFamiglia = item.Famiglie.Descrizione;
                    qsItem.Tipo = qrii.Applicazione;
                    qsItem.Descrizione = qrii.Descrizione;

                    //qsItem.DateFrom = null;
                    //qsItem.DateTo = null;
                    //if (this.chkPeriodo.Checked)
                    //{
                    //    qsItem.DateFrom = item.DateFrom.Value.Date;
                    //    qsItem.DateTo = item.DateTo.Value.Date;
                    //}

                    data.Add(qsItem);
                }
                else
                {
                   
                }
            }

            data = CalcolaTotali(data);

            this.objectListView1.SetObjects(data, true);
        }

        private void tsbSave_Click(object sender, EventArgs e)
        {
            QuickReportInfoFacade qrif = new QuickReportInfoFacade();

            qrif.Delete();

            List<QuickReportInfoItem> items = new List<QuickReportInfoItem>();
            foreach (ListViewItem item in this.listView1.Items)
            {
                QuickReportInfoItem qrii = (QuickReportInfoItem)item.Tag;
                items.Add(qrii);
            }

            if (qrif.Add(items))
            {
                MessageBox.Show("Salvataggio Filtri effettuato correttamente !", "Quick Reports", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show(string.Format("Si è verificato un errore durante il salvataggio dei dati !\n{0}\n{1}\n{2}", qrif.LastExceptionOccurred.Message, qrif.LastExceptionOccurred.InnerException, qrif.LastExceptionOccurred.StackTrace), "Quick Reports", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void selezionaTuttiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (ListViewItem obj in this.listView1.Items)
            {
                obj.Checked = true;
            }

            this.listView1.Refresh();
        }

        private void deselezionaTuttiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (ListViewItem obj in this.listView1.Items)
            {
                obj.Checked = false;
            }

            this.listView1.Refresh();
        }

        #region Load methods...
        private void LoadApplicazione2()
        {
            chkCmbApplicazione.Properties.Items.Clear();

            chkCmbApplicazione.Properties.Items.Add("b", "Base");
            chkCmbApplicazione.Properties.Items.Add("v", "Venatura");
            //chkCmbApplicazione.Properties.Items.Add("bv", "Base e Venatura");
        }

        private void LoadFamiglie()
        {
            FamigliaColoriFacade pf = new FamigliaColoriFacade();

            pf.RunAsync(() => pf.GetAll(), (result) =>
            {
                if (result != null)
                {
                    this.chkCmbFamiglia.Properties.Items.Clear();
                 
                    this.chkCmbFamiglia.Properties.DisplayMember = "Descrizione";
                    this.chkCmbFamiglia.Properties.ValueMember = "ID";
                    this.chkCmbFamiglia.Properties.DataSource = result;
                }
            });
        }

        private void LoadImpianti()
        {
            ImpiantoFacade pf = new ImpiantoFacade();

            pf.RunAsync(() => pf.GetImpianti2(), (result) =>
            {
                if (result != null)
                {
                    this.chkCmbImpianti.Properties.DisplayMember = "Nome";
                    this.chkCmbImpianti.Properties.ValueMember = "ID";
                    this.chkCmbImpianti.Properties.DataSource = result;
                }
            });
        }


        #endregion


    }
}
